Шаг 73 - Метод OpenRecordset.

Описание
Создает новый объект Recordset и добавляет его в семейство Recordsets.

Для объектов Connection и Database:
Set наборЗаписей = объект.OpenRecordset (источник, тип, параметры, блокировки)
Для объектов QueryDef, Recordset и TableDef:
Set наборЗаписей = объект.OpenRecordset (тип, параметры, блокировки)

Параметры
наборЗаписей
Объектная переменная, представляющая открываемый объект Recordset.
объект
Объектная переменная, представляющая существующий объект, используемый при создании нового объекта Recordset.
источник
Выражение или переменная типа String, определяющая источник записей для нового объекта Recordset. В качестве источника записей можно указать имя таблицы или запроса, а также инструкцию SQL, которая возвращает записи. Для табличного объекта Recordset в базе данных Microsoft Jet в качестве источника допускается указание только имени таблицы.
тип
Необязательный. Константа, указывающая тип открываемого объекта Recordset.

dbOpenTable			Открытие табличного объекта Recordset (только в рабочей области ядра Microsoft Jet).
dbOpenDynamic			Открытие объекта Recordset динамического типа, аналогичного динамическому 
				указателю ODBC (только в рабочей области ODBCDirect).
dbOpenDynaset			Открытие объекта Recordset типа динамического набора записей, аналогичного указателю 
				ключевого набора записей ODBC.
dbOpenSnapshot			Открытие объекта Recordset типа статического набора записей, аналогичного указателю 
				статического набора записей ODBC.
dbOpenForwardOnly 			Открытие объекта Recordset типа статического набора записей с 
				последовательным доступом. 

параметры
Необязательный. Произвольная комбинация следующих констант, задающих характеристики нового объекта Recordset.

dbAppendOnly 			Пользователям разрешается только добавление новых записей в объект Recordset 
				и запрещается изменение или удаление существующих записей (только для объектов 
				Recordset типа динамического набора записей в рабочей области Microsoft Jet).
dbSQLPassThrough 			Передача инструкции SQL для обработки источнику данных ODBC, подключенному к ядру 
				Microsoft Jet (только для объектов Recordset типа статического набора записей в рабочей 
				области Microsoft Jet).
dbSeeChanges			Генерация ошибки выполнения, если один пользователь изменил данные, редактируемые 
				другим пользователем (только для объектов Recordset типа динамического набора записей 
				в рабочей области Microsoft Jet).  Это удобно в ситуациях, когда несколько пользователей 
				имеют доступ для чтения/записи к одним и тем же данным. 
dbDenyWrite 			Запрет другим пользователям изменять или добавлять записи (только для объектов 
				Recordset в рабочей области Microsoft Jet).
dbDenyRead 			Запрет другим пользователям на чтение данных в таблице (только для объектов Recordset 
				типа таблицы в рабочей области Microsoft Jet).
dbForwardOnly 			Создание объекта Recordset типа статического набора записей с последовательным 
				доступом (только для объектов Recordset типа статического набора записей в рабочей 
				области Microsoft Jet).  Данная константа включена только для совместимости с предыдущими 
				версиями, вместо нее в аргументе тип следует использовать константу dbOpenForwardOnly.
dbReadOnly 			Запрет пользователям на внесение изменений в объект Recordset (только в рабочей области 
				Microsoft Jet). Данная константа включена только для совместимости с предыдущими версиями, 
				вместо нее следует использовать константу dbReadOnly в аргументе блокировки.
dbRunAsync			Запуск асинхронного запроса (только в рабочей области ODBCDirect).
dbExecDirect 			Запуск запроса без выполнения инструкции SQLPrepare с прямым вызовом инструкции 
				SQLExecDirect (только в рабочей области ODBCDirect). Данный параметр нельзя использовать 
				при открытии объекта Recordset на основе запроса с параметрами.  Дополнительные сведения 
				см. в руководстве по программированию Microsoft ODBC 3.0.
dbInconsistent 			Разрешение несогласованных обновлений (только для объектов Recordset типа динамического 
				или статического набора записей в рабочей области Microsoft Jet).
dbConsistent 			Разрешение только согласованных обновлений (только для объектов Recordset типа 
				динамического или статического набора записей в рабочей области Microsoft Jet).

блокировки
Необязательный. Константа, определяющая тип блокировки объекта Recordset.

dbReadOnly			Запрет пользователям на внесение изменений в объект Recordset (настройка по умолчанию 
				для рабочей области ODBCDirect).  Использование константы dbReadOnly допускается только в 
				одном из аргументов параметры или блокировки.  Если задать эту константы в двух аргументах 
				одновременно, возникает ошибка выполнения.
dbPessimistic 			Использование жесткой блокировки при определении возможности изменения объекта Recordset 
				в многопользовательской среде.  Страница, содержащая обрабатываемую запись, блокируется при 
				вызове метода Edit (настройка по умолчанию для рабочей области Microsoft Jet).
dbOptimistic 			Использование нежесткой блокировки при определении возможности изменения объекта 
				Recordset в многопользовательской среде.  Страница, содержащая обрабатываемую запись, 
				блокируется при вызове метода Update.
dbOptimisticValue 			Использование нежесткой блокировки при конкурентном доступе на основании значений 
				строк (только в рабочей области ODBCDirect).
dbOptimisticBatch 			Включение режима пакетного обновления с нежесткой блокировкой (только в рабочей области 
				ODBCDirect).

Замечания
В рабочей области ядра Microsoft Jet, если аргумент объект задает объект QueryDef или объект Recordset типа динамического набора записей или статического набора записей, а также, если аргумент источник задает инструкцию SQL или объект TableDef, представляющий присоединенную таблицу, то не допускается использование константы dbOpenTable в аргументе тип; в противном случае возникает ошибка выполнения. Если требуется использовать запрос к серверу SQL для присоединенной таблицы при подключении ядра Microsoft Jet к источнику данных ODBC, необходимо сначала указать в свойстве Connect базы данных, содержащей присоединенную таблицу, допустимую строку подключения ODBC. Для однократного прохода по объекту Recordset, открытому при подключении ядра Microsoft Jet к источнику данных ODBC, можно повысить быстродействие, задав константу dbOpenForwardOnly в аргументе тип.
Если аргумент объект задает объект Recordset типа динамического набора записей или статического набора записей, то новый объект Recordset является объектом того же типа. Если аргумент объект задает табличный объект Recordset, то новый объект является объектом Recordset типа динамического набора записей. Не допускается открытие нового объекта Recordset на основе статического набора записей с последовательным доступом или объектов Recordset ODBCDirect.
В рабочей области ODBCDirect возможно открытие Recordset, с указанием более одного запроса на выборку в аргументе источник, например:

"SELECT Фамилия, Имя FROM Авторы 
WHERE Фамилия = 'Иванов';
SELECT Заголовок, ISBN FROM Заголовки 
WHERE Код Like '1-55615-*'"

В возвращенном объекте Recordset будут открыты результаты первого запроса. Чтобы открыть результаты следующих запросов, следует вызвать метод NextRecordset.
Пользователь имеет возможность с помощью средств ODBCDirect отправлять запросы DAO на различные серверы баз данных. При этом следует помнить, что разные серверы могут использовать различающиеся диалекты языка SQL. Поэтому из справочной системы исключена контекстная правка языка Microsoft Jet SQL, хотя интерактивная справочная система Microsoft Jet SQL по-прежнему доступна в меню. При использовании подключений ODBCDirect или запросов к серверу в приложения, использующих подключения через ядро Microsoft Jet, проверяйте по документации сервера, какой диалект языка SQL использует сервер базы данных.
Константа dbSeeChanges позволяет в рабочей области Microsoft Jet перехватывать при работе с записью изменения, вносимые в ту же запись другими пользователями. Например, если два пользователя начинают изменять одну и ту же запись, успешно выполнить обновление сможет только пользователь, первым вызвавший метод Update. При вызове метода Update вторым пользователем возникнет ошибка при выполнении. Аналогично этому, ошибка выполнения возникает, если второй пользователь пытается с помощью метода Delete удалить запись, в которую первый пользователь успел занести изменения.
Обычно, перехват такой ошибки должен приводить к программному обновлению содержимого полей и загрузке измененных значений. Если ошибка возникает при попытке удаления, программа должна вывести новое содержимое записи и сообщение, показывающее, что запись недавно была изменена. Программа должна запросить подтверждение на удаление измененной записи.
Кроме того, константу dbSeeChanges следует использовать, если пользователь открывает объект Recordset при подключении ядра Microsoft Jet к источнику данных ODBC, который является таблицей Microsoft SQL Server версии 6.0 (или более поздней) со столбцом IDENTITY, в противном случае может возникнуть ошибка.
В рабочей области ODBCDirect допускается выполнение запросов в асинхронном режиме, задаваемом константой dbRunAsync в аргументе параметры. Это позволяет приложению продолжать обработку других инструкций во время выполнения запроса в фоновом режиме. Однако пользователь не сможет в этом случае получить доступ к данным в объекте Recordset до завершения запроса. Чтобы определить, закончено ли выполнение запроса, следует проверить значение свойства StillExecuting нового объекта Recordset. Если выполнение запроса занимает больше времени, чем предполагается, пользователь имеет возможность прекратить выполнение с помощью метода Cancel.
Попытка открыть несколько объектов Recordset на основе одного источника данных ODBCOpenRecordset. Одним из способов обойти эту трудность является использование указателя на стороне сервера и средств ODBCDirect, если они поддерживается сервером. Другим способом является заполнение объекта Recordset с помощью метода MoveLast при открытии объекта Recordset.
Если открыть объект Connection с заданным для свойства DefaultCursorDriver значением dbUseClientBatchCursor, пользователь имеет возможность открыть объект Recordset как буфер для измененных данных в рабочей области ODBCDirect (такой способ называют пакетным обновлением). Для включения буфера обновления следует указать константу dbOptimisticBatch в аргументе блокировки. Дополнительные сведения о выборе способа немедленной записи изменений на диск или способа обновления через буфер с их последующей записью на диск в пакете см. в разделе справки для метода Update.
Закрытие объекта Recordset с помощью метода Close приводит к автоматическому удалению объекта из семейства Recordsets.
Если в аргументе источник указана инструкция SQL, образованная путем слияния строки с нецелым числовым значением, а в системной настройке задано использование неамериканского символа десятичного разделителя, такого как запятая (например, strSQL = "ЦЕНА > " & lngPrice, где lngPrice = 125,50), то при попытке открыть объект Recordset возникает ошибка. Причина заключается в том, что число преобразуется в строковое значение с использованием текущей системной настройки, а в языке SQL распознается только американский символ разделителя целой и дробной части (десятичная точка).

Пример
Следующая программа использует метод OpenRecordset для открытия пяти объектов Recordset и отображения их содержимого. Для выполнения данной процедуры требуется процедура OpenRecordsetOutput.

Sub OpenRecordsetX()

	Dim wrkJet As Workspace
	Dim wrkODBC As Workspace
	Dim dbsNorthwind As Database
	Dim conPubs As Connection
	Dim rstTemp As Recordset
	Dim rstTemp2 As Recordset
	' Открывает сеансы Microsoft Jet и ODBCDirect, базу данных 
	' Microsoft Jet и подключение ODBCDirect.
	Set wrkJet = CreateWorkspace("", "admin", "", dbUseJet)
	Set wrkODBC = CreateWorkspace("", "admin", "", dbUseODBC)
	Set dbsNorthwind = wrkJet.OpenDatabase("Борей.mdb")

	Set conPubs = wrkODBC.OpenConnection("", , , "ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers")
	' Открывает пять объектов Recordset и отображает 
	' содержимое каждого объекта.
	Debug.Print "С последовательным доступом, " & 	"где источником является объект QueryDef..."
	Set rstTemp = dbsNorthwind.OpenRecordset( "Десять самых дорогих товаров", dbOpenForwardOnly)
	OpenRecordsetOutput rstTemp
	Debug.Print "Динамический набор записей только для чтения, " & "где источником является инструкция SQL..."
	Set rstTemp = dbsNorthwind.OpenRecordset( "SELECT * FROM Сотрудники", dbOpenDynaset, dbReadOnly)
	OpenRecordsetOutput rstTemp
	' Использует свойство Filter для отбора записей 
	' при следующем вызове метода OpenRecordset.
	Debug.Print "Отбор записей из существующего " &  "объекта Recordset..." rstTemp.Filter = "Фамилия >= 'Ж'"
	Set rstTemp2 = rstTemp.OpenRecordset()
	OpenRecordsetOutput rstTemp2
	Debug.Print "Набор записей динамического типа " & "для подключения ODBC..."
	Set rstTemp = conPubs.OpenRecordset( "SELECT * FROM stores", dbOpenDynamic)
	OpenRecordsetOutput rstTemp
	' С помощью свойства StillExecuting проверяет, готов ли 
	' объект Recordset для обработки.
	Debug.Print "Статический набор записей на основе " &  "асинхронного запроса для подключения ODBC..."
	Set rstTemp = conPubs.OpenRecordset("publishers", dbOpenSnapshot, dbRunAsync)
	Do While rstTemp.StillExecuting Debug.Print "    [еще выполняется...]"
	Loop
	OpenRecordsetOutput rstTemp
	rstTemp.Close
	dbsNorthwind.Close
	conPubs.Close
	wrkJet.Close
	wrkODBC.Close
End Sub

Sub OpenRecordsetOutput(rstOutput As Recordset)
	' Отображает указанный объект Recordset.
	With rstOutput
		Do While Not .EOF
			Debug.Print , .Fields(0), .Fields(1) .MoveNext
		Loop
	End With
End Sub
Hosted by uCoz